package clases.Vectores;

import clases.*;
import java.util.Enumeration;
import java.util.Hashtable;
import main.Errores;
import main.Global;
import org.w3c.dom.*;

/**
  *  4g3nt
  *  Copyright (C) 2008  Carlos Molinero y César Andrés
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *    You should have received a copy of the GNU General Public License
  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
public class Vectores {
    private Hashtable _recursos = new Hashtable();
    protected String _nick="";
    private static final String TAG_PARES="PARES";
    private static final String TAG_PAR="PAR";
    private static final String TAG_NOMBRE="NOMBRE";
    private static final String TAG_CANTIDAD="CANTIDAD";

    public Vectores(){}
    public Vectores (Element raiz)
    {
        NodeList listOfRoot= raiz.getElementsByTagName(TAG_PARES);
 	Element firstRecursoElement = (Element)listOfRoot.item(0);
	NodeList firstRootList = firstRecursoElement.getElementsByTagName(TAG_PAR);
	Global.escribir("<li class=\"closed\"><span class=\"folder\"> Pares</span>");
	Global.escribir("<ul>");
        for(int s=0; s<firstRootList.getLength() ; s++)
	       {
	       Node var_node = firstRootList.item(s);
	       if(var_node.getNodeType()==Node.ELEMENT_NODE)
                {
                        //Leemos el nombre y el valor
                Element firstResource= (Element)var_node;
                //-------
                NodeList firstList = firstResource.getElementsByTagName(TAG_NOMBRE);
                Element firstElement = (Element)firstList.item(0);

                NodeList textFNList = firstElement.getChildNodes();
                String nombre= ((Node)textFNList.item(0)).getNodeValue().trim();
                //-------
                firstList = firstResource.getElementsByTagName(TAG_CANTIDAD);
                firstElement = (Element)firstList.item(0);
                textFNList = firstElement.getChildNodes();
                String cantidad= ((Node)textFNList.item(0)).getNodeValue().trim();
                Global.escribir("<li><span class=\"file\">"+nombre+"="+cantidad+"</span></li>");
                ElementoVector recurso = new ElementoVector(nombre,Float.parseFloat(cantidad));
                addRecurso(recurso);
                }
	        }
        Global.escribir("</ul>");
        Global.escribir("</li>");
    }
	public void addRecurso(ElementoVector recurso)
    {
    	if (_recursos.get(recurso.getNombre())!=null)
    		{
    		 Errores.insertar("Recurso"+recurso.toString()+" Repetido");
    		}
    	_recursos.put(recurso.getNombre(), recurso);
    }
    public void print()
    {
   	 Global.escribir("<li class=\"closed\"><span class=\"folder\"> Recursos</span>");
	 Global.escribir("<ul>");
	 Enumeration it_recursos = _recursos.keys();
	 while (it_recursos.hasMoreElements())
	 {
		 ElementoVector var_recurso = (ElementoVector)_recursos.get(it_recursos.nextElement());
	 	 Global.escribir("<li><span class=\"file\">"+var_recurso.getNombre()+"="+var_recurso.getValor()+"</span></li>");	 
	 }	 	
	 
	 Global.escribir("</ul>");
         Global.escribir("</li>");
         if (!_nick.equals(""))Global.escribir("<li><span class=\"file\">"+_nick+"</span></li>");	
    }
    @SuppressWarnings("unchecked")
	public void actualizaRecurso(String recurso, float valor)
    {
    	ElementoVector var_recurso = (ElementoVector)_recursos.get(recurso);
    	if (var_recurso==null) 
    	{var_recurso = new ElementoVector(recurso,0);}
    	else{
    		var_recurso = new ElementoVector(var_recurso);
    		_recursos.remove(recurso);}
    	var_recurso.sumaValor(valor);
    	_recursos.put(recurso, var_recurso);
    		
    }
    public float getValue(String recurso)
    {
    	ElementoVector var_recurso = (ElementoVector)_recursos.get(recurso);
    	if (var_recurso==null) return 0f;
    	return var_recurso.getValor();
    }
    /**
     * Suma la lista de recursos que se pasa por parametro al objeto que lo llama.
     * Devuelve una lista de recursos con:
     * 		La suma de los valores comunes de los recursos de los dos vectores.
     * 		El resto de los valores no comunes de los dos vectores.
     */
	public Vectores sumarVectores(Vectores var_recurso)
    {
    	Vectores resultado = new Vectores() {};
    	Enumeration it_varrecurso = var_recurso._recursos.keys();
    	while (it_varrecurso.hasMoreElements())
    	{
    		ElementoVector recurso_nuevo = new ElementoVector((ElementoVector)var_recurso._recursos.get(it_varrecurso.nextElement()));
    		//Preguntamos si existe en this
    		if (_recursos.get(recurso_nuevo.getNombre())!=null)
    			{
    				//Lo sumamos al valor de _recurso
    			recurso_nuevo.sumaValor(((ElementoVector)_recursos.get(recurso_nuevo.getNombre())).getValor());
    			}
    		resultado._recursos.put(recurso_nuevo.getNombre(), recurso_nuevo);
    	}
    	//Ahora copiamos el resto de valores de this
    	it_varrecurso = _recursos.keys();
    	while (it_varrecurso.hasMoreElements())
    	{
    		ElementoVector recurso_nuevo = new ElementoVector((ElementoVector)_recursos.get(it_varrecurso.nextElement()));
    		if (resultado._recursos.get(recurso_nuevo.getNombre())==null)
    		{
    			resultado._recursos.put(recurso_nuevo.getNombre(), recurso_nuevo.getValor());
    		}
    	}
       	return resultado;
    }
    public String getNick()
    {
        return _nick;
    }
    
    /**
     * Devuelve un vector cuyos 
     *      Dominio de recursos = dominio de recursos de A
     *      Valor de esos recursos : valor de recursos en B si existe, o 0 si no existe.
     * @param a
     * @param b
     * @return
     */
    public static Vectores normalizar(Vectores a, Vectores b)
    {
    
        Vectores resultado = new Vectores();
        Enumeration it_valores= a._recursos.keys();
        while(it_valores.hasMoreElements())
        {
            String key = (String)it_valores.nextElement();
            if (b._recursos.get(key)!=null)
                {
                resultado._recursos.put(key, new ElementoVector((ElementoVector)b._recursos.get(key)));
                }
            else
                {
                resultado._recursos.put(key, new ElementoVector(key,0f));
                }
        }
        return resultado;
    }
    
    @Override
    public String toString()
    {
        String resultado="";
        Enumeration it_valores= _recursos.elements();
        while(it_valores.hasMoreElements())
        {
            ElementoVector var_elem = (ElementoVector)it_valores.nextElement();
            resultado +=var_elem.toString()+"\n";
        }
        return resultado;
    } 
}